home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 5817 / 5817.xpi / chrome / resource / tokenize.js < prev   
Text File  |  2010-02-11  |  6KB  |  190 lines

  1. let EXPORTED_SYMBOLS = ["sql_tokenizer", "replaceObjectNameInSql", "getViewSchemaSelectStmt"];
  2.  
  3. //follow the function SQLITE_API int sqlite3_complete(const char *zSql)
  4. //from sqlite3.c (3.5.9)
  5. var tkSEMI    = 0;
  6. var tkWS      = 1;
  7. var tkOTHER   = 2;
  8. var tkEXPLAIN = 3;
  9. var tkCREATE  = 4;
  10. var tkTEMP    = 5;
  11. var tkTRIGGER = 6;
  12. var tkEND     = 7;
  13.  
  14. var trans = [
  15.                      /* Token:                                                */
  16.      /* State:       **  SEMI  WS  OTHER EXPLAIN  CREATE  TEMP  TRIGGER  END  */
  17.      /* 0   START: */ [    0,  0,     1,      2,      3,    1,       1,   1,  ],
  18.      /* 1  NORMAL: */ [    0,  1,     1,      1,      1,    1,       1,   1,  ],
  19.      /* 2 EXPLAIN: */ [    0,  2,     1,      1,      3,    1,       1,   1,  ],
  20.      /* 3  CREATE: */ [    0,  3,     1,      1,      1,    3,       4,   1,  ],
  21.      /* 4 TRIGGER: */ [    5,  4,     4,      4,      4,    4,       4,   4,  ],
  22.      /* 5    SEMI: */ [    5,  5,     4,      4,      4,    4,       4,   6,  ],
  23.      /* 6     END: */ [    0,  6,     4,      4,      4,    4,       4,   4,  ]
  24.   ];
  25.  
  26. function sql_tokenizer(input) {
  27.   var re_comment_oneline = /--[^\n]*/
  28.   var re_comment_multiline = /\/\*(?:.|[\n\r])*?\*\//
  29.  
  30.   var re_ident = /[a-zA-Z_][\w]*/
  31.  
  32.   var re_integer = /[+-]?\d+/
  33.   var re_float = /[+-]?\d+(([.]\d+)*([eE][+-]?\d+))?/
  34.  
  35.   var re_doublequote = /["][^"]*["]/
  36.   var re_singlequote = /['][^']*[']/
  37.   var re_backquote = /[`][^`]*[`]/
  38.   var re_msstyleidentifier = /[\[][^\]]*[\]]/
  39.  
  40.   var re_spaces = /[\s]+/
  41.   var re_symbol = /\S/
  42.  
  43.   var re_token = /--[^\n]*|\/\*(?:.|\n|\r)*?\*\/|["][^"]*["]|['][^']*[']|[`][^`]*[`]|[\[][^\]]*[\]]|[a-zA-Z_][\w]*|[+-]?\d+(([.]\d+)*([eE][+-]?\d+))?|[+-]?\d+|[\s]+|./g
  44.   var a = input.match(re_token);
  45.  
  46.   var token, type, tk, stmt = "", state = 0;
  47.   var s = [], allSt = [];
  48. //bOnlyWhitespace: false if a non-whitespace token is found within a statement.
  49. //this is used to add the last statement if (it contains any token except tkWS
  50. //and it is not terminated by semicolon)
  51.   var bOnlyWhitespace = true;
  52.   for (var i = 0; i < a.length; i++) {
  53.     type = "symbol";
  54.     tk = tkOTHER;
  55.     token = a[i];
  56.     if (token == ";") {
  57.       tk = tkSEMI;
  58.     }
  59.     else if (token.match(re_comment_oneline)) {
  60.       tk = tkWS;
  61.       type = "linecomment";
  62.     }
  63.     else if (token.match(re_comment_multiline)) {
  64.       tk = tkWS;
  65.       type = "fullcomment";
  66.     }
  67.     else if (token.match(re_spaces)) {
  68.       tk = tkWS;
  69.       type = "ws";
  70.     }
  71.     else if (token.match(re_ident)) {
  72.       type = "ident";
  73.       var tt = token.toLowerCase();
  74.       if (tt == "create")
  75.         tk = tkCREATE;
  76.       else if (tt == "temp" || tt == "temporary")
  77.         tk = tkTEMP;
  78.       else if (tt == "trigger")
  79.         tk = tkTRIGGER;
  80.       else if (tt == "explain")
  81.         tk = tkEXPLAIN;
  82.       else if (tt == "end")
  83.         tk = tkEND;
  84.     }
  85.     if (token.match(/[\n\s]+/))
  86.       tk = tkWS;
  87.     state = trans[state][tk];
  88.     stmt += token;
  89.     if (tk != tkWS) bOnlyWhitespace = false;
  90.     if (state == 0 && tk == tkSEMI) {
  91.       allSt.push(stmt);
  92.       stmt = "";
  93.       bOnlyWhitespace = true;
  94.     }
  95.     
  96.   }
  97. //  if (stmt != "" && /\s*/.exec(stmt)[0].length != stmt.length)
  98.   if (stmt != "" && !bOnlyWhitespace)
  99.     allSt.push(stmt);
  100.  
  101.   return allSt;
  102. }
  103.  
  104. // for create statements in sqlite master
  105. function replaceObjectNameInSql(sOriginalSql, sNewObjName) {
  106.   var re_ident = /[a-zA-Z_][\w]*/
  107.  
  108.   var re_doublequote = /["][^"]*["]/
  109.   var re_singlequote = /['][^']*[']/
  110.   var re_backquote = /[`][^`]*[`]/
  111.   var re_msstyleidentifier = /[\[][^\]]*[\]]/
  112.  
  113.   var re_token = /--[^\n]*|\/\*(?:.|\n|\r)*?\*\/|["][^"]*["]|['][^']*[']|[`][^`]*[`]|[\[][^\]]*[\]]|[a-zA-Z_][\w]*|[+-]?\d+(([.]\d+)*([eE][+-]?\d+))?|[+-]?\d+|[\s]+|./g
  114.  
  115.   var a = sOriginalSql.match(re_token);
  116.  
  117.   var token, type, tk, stmt = "", state = 0;
  118.   var s = [], allSt = [];
  119.   var tempTokens = [];
  120.  
  121.   for (var i = 0; i < a.length; i++) {
  122.     token = a[i];
  123.     if (token.match(re_ident)
  124.       || token.match(re_doublequote)
  125.       || token.match(re_singlequote)
  126.       || token.match(re_backquote)
  127.       || token.match(re_msstyleidentifier)) {
  128.       var tt = token.toLowerCase();
  129.       if (tempTokens.length < 3)
  130.         tempTokens.push([i,tt]);
  131.       else
  132.         break;
  133.     }
  134.   }
  135.   var aTypes = ["table", "index", "view", "trigger"];
  136.   if (tempTokens.length >= 3) {
  137.     if (tempTokens[0][1] == "create" && aTypes.indexOf(tempTokens[1][1]) >= 0) {
  138.       var iObjNamePosition = tempTokens[2][0]; //position of original name
  139.       a[iObjNamePosition] = sNewObjName; //change name
  140.       return a.join(""); //new statement with objname replaced
  141.     }  
  142.   }
  143.   //otherwise return empty string
  144.   return "";
  145. }
  146.  
  147. function getViewSchemaSelectStmt(sOriginalSql) {
  148.   var re_ident = /[a-zA-Z_][\w]*/
  149.  
  150.   var re_doublequote = /["][^"]*["]/
  151.   var re_singlequote = /['][^']*[']/
  152.   var re_backquote = /[`][^`]*[`]/
  153.   var re_msstyleidentifier = /[\[][^\]]*[\]]/
  154.  
  155.   var re_token = /--[^\n]*|\/\*(?:.|\n|\r)*?\*\/|["][^"]*["]|['][^']*[']|[`][^`]*[`]|[\[][^\]]*[\]]|[a-zA-Z_][\w]*|[+-]?\d+(([.]\d+)*([eE][+-]?\d+))?|[+-]?\d+|[\s]+|./g
  156.  
  157.   var a = sOriginalSql.match(re_token);
  158.  
  159.   var token, type, tk, stmt = "", state = 0;
  160.   var s = [], allSt = [];
  161.   var tempTokens = [];
  162.  
  163.   for (var i = 0; i < a.length; i++) {
  164.     token = a[i];
  165.     if (token.match(re_ident)
  166.       || token.match(re_doublequote)
  167.       || token.match(re_singlequote)
  168.       || token.match(re_backquote)
  169.       || token.match(re_msstyleidentifier)) {
  170.       var tt = token.toLowerCase();
  171.       if (tempTokens.length < 4)
  172.         tempTokens.push([i,tt]);
  173.       else
  174.         break;
  175.     }
  176.   }
  177.   var aTypes = ["table", "index", "view", "trigger"];
  178.   if (tempTokens.length >= 4) {
  179.     if (tempTokens[0][1] == "create" && aTypes.indexOf(tempTokens[1][1]) >= 0) {
  180.       var iObjNamePosition = tempTokens[2][0]; //position of original name
  181.       iObjNamePosition = tempTokens[3][0]; //position of "AS" in view stmt
  182.       a.splice(0, iObjNamePosition + 1); //remove tokens upto name
  183.       return a.join(""); //string after removing "create objtype objname"
  184.     }  
  185.   }
  186.   //otherwise return empty string
  187.   return "";
  188. }
  189.  
  190.